package 位图;

/**
 * @author ljb
 * @version 1.0
 * @Date 2024/12/6
 */
public class Code02_DesignBitsetTest {
    // 测试链接 : https://leetcode-cn.com/problems/design-bitset/

    class Bitset{
        private int[] set;
        private final int size;
        private int zeros;
        private int ones;
        private boolean reverse;

        public Bitset(int n){
            set = new int[(n+31)/32];
            size = n;
            zeros = n;
            ones = 0;
            reverse = false;
        }

        // 把i这个数字加入到位图
        public void fix(int i) {
            int index = i / 32;
            int bit = i % 32;
            if(!reverse){
                // 位图所有位的状态，维持原始含义
                // 0 : 不存在
                // 1 : 存在
                if((set[index] & (1 << bit)) == 0){
                //表示i之前没有加入位图，如果已经加入则什么都不用做
                    zeros--;
                    ones++;
                    set[index] |= (1 << bit);
                }
            }else{
                // 位图所有位的状态，翻转了
                // 0 : 存在
                // 1 : 不存在
                if((set[index] & (1 << bit)) != 0){
                    zeros--;
                    ones++;
                    set[index] ^= (1 << bit);
                }
            }
        }

        // 把i这个数字从位图中移除
        public void unfix(int i) {
            int index = i / 32;
            int bit = i % 32;
            if(!reverse){
                if((set[index] & (1 << bit)) != 0){
                    ones--;
                    zeros++;
                    set[index] ^= (1 << bit);
                }
            }else {
                if((set[index] & (1 << bit)) == 0){
                    ones--;
                    zeros++;
                    set[index] |= (1 << bit);
                }
            }
        }

        public void flip() {
            reverse = !reverse;
            int tmp = zeros;
            zeros = ones;
            ones = tmp;
        }

        // 检查 Bitset 中 每一位 的值是否都是 1
        public boolean all() {
            return ones == size;
        }

        // 检查 Bitset 中 是否 至少一位 的值是 1
        public boolean one() {
            return ones > 0;
        }

        //1的数量
        public int count() {
            return ones;
        }

        public String toString() {
            StringBuilder builder = new StringBuilder();
            for(int i = 0, k = 0, number, status; i < size; k++){
                number = set[k];
                for(int j = 0; j < 32 && i < size;j++, i++){
                    status = (number >> j) & 1;//拿出三十二位每一位的状态
                    status ^= reverse ? 1 : 0;
                    builder.append(status);
                }
            }
            return builder.toString();
        }
    }
}
